package com.gao.controller.rabbit;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * Work queues工作模式,两个消费者间是竞争关系,不能消费同一条信息
 * @author gaofeng
 * @date 2022年09月05日 22:29
 */
public class ConsumerWorkerQueueController {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = MyChannelFactory.getConnection();
        // 4.创建channel
        Channel channel = connection.createChannel();
        /* 5.创建队列Queue
         (String var1, boolean var2, boolean var3, boolean var4, Map<String, Object> var5)
             var1:队列名称
             var2:是否持久化,是:mq重启之后,还在
             var3:是否独占,只能有一个消费者监听这个队列
             var4:是否自动删除,当没有consumer时,自动删除掉
             var5:参数
             如果没有名叫hello_rabbitmq的队列,则会创建
         */
        channel.queueDeclare("work_queues_rabbitmq", true, false, false, null) ;
        /*
         * 6.接收
         * String var1, boolean var2, Consumer var3
         *  var1:队列名称
         *  var2:是否自动确认
         *  var3:回调对象
         */
        Consumer consumer = new DefaultConsumer(channel) {
            /*
             * 回调方法,当收到消息后,自动执行该方法
             * consumerTag: 消息标识
             * envelope: 获取一些信息:交换机信息,路由key信息....
             * properties: 配置的信息
             * body: 数据
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println(consumerTag);
                System.out.println(envelope.getExchange());
                System.out.println(envelope.getRoutingKey());
            }
        };
        channel.basicConsume("work_queues_rabbitmq", true, consumer);
        // 7.不要释放资源,要一直监听
    }
}
